home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / os2tools / bnklysrc / btconfig.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-05-08  |  29.5 KB  |  831 lines

  1. /*--------------------------------------------------------------------------*/
  2. /*                                                                          */
  3. /*                                                                          */
  4. /*      ------------         Bit-Bucket Software <no-Inc>                   */
  5. /*      \ 10001101 /         Writers and Distributors of                    */
  6. /*       \ 011110 /          No-Cost<no-tm> Software.                       */
  7. /*        \ 1011 /                                                          */
  8. /*         ------                                                           */
  9. /*                                                                          */
  10. /*  Copyright (C) 1987, 1988, 1989 by Robert Hartman and Vincent Perriello  */
  11. /*                                                                          */
  12. /*                                                                          */
  13. /*               This module was written by Vince Perriello                 */
  14. /*                                                                          */
  15. /*                                                                          */
  16. /*                  BinkleyTerm Configuration File Parser                   */
  17. /*                                                                          */
  18. /*                                                                          */
  19. /*    For complete  details  of the licensing restrictions, please refer    */
  20. /*    to the License  agreement,  which  is published in its entirety in    */
  21. /*    the MAKEFILE and BT.C, and also contained in the file LICENSE.210.    */
  22. /*                                                                          */
  23. /*    USE  OF THIS FILE IS SUBJECT TO THE  RESTRICTIONS CONTAINED IN THE    */
  24. /*    BINKLEYTERM  LICENSING  AGREEMENT.  IF YOU DO NOT FIND THE TEXT OF    */
  25. /*    THIS  AGREEMENT IN ANY OF THE  AFOREMENTIONED FILES,  OR IF YOU DO    */
  26. /*    NOT HAVE THESE FILES,  YOU SHOULD  IMMEDIATELY CONTACT THE AUTHORS    */
  27. /*    AT THE  ADDRESSES LISTED BELOW.  IN NO EVENT SHOULD YOU PROCEED TO    */
  28. /*    USE   THIS  FILE  WITHOUT  HAVING   ACCEPTED  THE  TERMS  OF   THE    */
  29. /*    BINKLEYTERM  LICENSING AGREEMENT,  OR SUCH OTHER  AGREEMENT AS YOU    */
  30. /*    ARE ABLE TO REACH WITH THE AUTHORS.                                   */
  31. /*                                                                          */
  32. /*                                                                          */
  33. /*    The Authors can be reached at the following addresses:                */
  34. /*                                                                          */
  35. /*    Robert C. Hartman                      Vincent E. Perriello           */
  36. /*    Spark Software                         VEP Software                   */
  37. /*    427-3 Amherst Street                   111 Carroll Street             */
  38. /*    CS2032, Suite 232                      Naugatuck, CT 06770            */
  39. /*    Nashua, NH 03061                                                      */
  40. /*                                                                          */
  41. /*    FidoNet 1:132/101                      FidoNet 1:141/491              */
  42. /*    Data    (603) 888-8179                 Data    (203) 729-7569         */
  43. /*                                                                          */
  44. /*    Please feel free to contact us at any time to share your comments     */
  45. /*    about our software and/or licensing policies.                         */
  46. /*                                                                          */
  47. /*--------------------------------------------------------------------------*/
  48.  
  49. #include <stdio.h>
  50. #include <signal.h>
  51. #include <ctype.h>
  52. #include <conio.h>
  53. #include <stdlib.h>
  54. #include <string.h>
  55. #include <io.h>
  56. #include <dos.h>
  57. #include <sys\types.h>
  58. #include <sys\stat.h>
  59.  
  60. #ifdef OS_2 /*PLF Sat  05-06-1989  06:09:36 */
  61. #define INCL_DOS
  62. #include <os2.h>
  63. #endif
  64.  
  65. #ifdef __TURBOC__
  66. #include <alloc.h>
  67. #else
  68. #include <malloc.h>
  69. #endif
  70.  
  71. #include "com.h"
  72. #include "xfer.h"
  73. #include "zmodem.h"
  74. #include "keybd.h"
  75. #include "sbuf.h"
  76. #include "sched.h"
  77. #include "externs.h"
  78. #include "prototyp.h"
  79.  
  80. static char *ctl_slash_string (char *);
  81. static int Zone = 1;
  82.  
  83. void parse_config (config_file)
  84. char *config_file;
  85. {
  86.    FILE *stream;
  87.    char temp[256];
  88.    char *c;
  89.    int i;
  90.    char *p, *p1;
  91.    PN_TRNS *tpn;
  92.  
  93.    sprintf (temp, "%s%s", BINKpath, config_file);
  94.    if ((stream = fopen (temp, "r")) == NULL)     /* OK, let's open the file   */
  95.       return;                                    /* no file, no work to do    */
  96.  
  97.    while ((fgets (temp, 255, stream)) != NULL)   /* Now we parse the file ... */
  98.       {
  99.       c = temp;                                  /* Check out the first char  */
  100.       if ((*c == '%') || (*c == ';'))            /* See if it's a comment
  101.                                                   * line */
  102.          continue;
  103.  
  104.       i = strlen (temp);                         /* how long this line is     */
  105.  
  106.       if (i < 3)
  107.          continue;                               /* If too short, ignore it   */
  108.  
  109.       c = &temp[--i];                            /* point at last character   */
  110.       if (*c == '\n')                            /* if it's a newline,        */
  111.          *c = '\0';                              /* strip it off              */
  112.  
  113.       switch (parse (temp, config_lines))
  114.          {
  115.          case 1:                                /* "SameRing"      */
  116.             modemring = 1;
  117.             break;
  118.  
  119.          case 2:                                /* "NewNodeList"   */
  120.             newnodelist = 1;
  121.             break;
  122.  
  123.          case 3:                                /* "QuickNodeList" */
  124.             nodefunc = QuickLookup;
  125.             break;
  126.  
  127.          case 4:                                /* "Answerback"  */
  128.             answerback = ctl_string (&temp[10]);
  129.             break;
  130.  
  131.          case 5:                                /* "Macro"         */
  132.             c = skip_blanks (&temp[5]);
  133.             i = atoi (c);
  134.             if ((i <= 0) || (i > 9))
  135.                {
  136.                printf ("Macro number %d is out of range 1-9\n", i);
  137.                break;
  138.                }
  139.             c = skip_to_blank (c);
  140.             c = skip_blanks (c);
  141.             keys[i - 1] = malloc (strlen (c) + 1);
  142.             p = keys[i - 1];
  143.             while (*c && (*c != '\n'))
  144.                {
  145.                if (*c == '|')
  146.                   *p++ = '\r';
  147.                else *p++ = *c;
  148.                ++c;
  149.                }
  150.             *p = '\0';
  151.             break;
  152.  
  153.          case 6:                                /* "Shell"        */
  154.             c = skip_blanks (&temp[5]);
  155.             i = atoi (c);
  156.             if ((i <= 0) || (i > 9))
  157.                {
  158.                printf ("Shell number %d is out of range 1-9\n", i);
  159.                break;
  160.                }
  161.             c = skip_to_blank (c);
  162.             c = skip_blanks (c);
  163.             shells[i - 1] = malloc (strlen (c) + 1);
  164.             strcpy (shells[i - 1], c);
  165.             strupr (shells[i - 1]);
  166.             break;
  167.  
  168.          case 7:                                /* "Dial"         */
  169.             p = &temp[4];
  170.             while ((*p) && (isspace (*p)))
  171.                ++p;
  172.  
  173.             if ((*p == ';') || (*p == '\0'))
  174.                {
  175.                break;
  176.                }
  177.  
  178.             tpn = (PN_TRNS *) malloc (sizeof (PN_TRNS));
  179.  
  180.             p1 = tpn->num;
  181.             while ((*p) && (!isspace (*p)))
  182.                {
  183.                *p1++ = *p++;
  184.                }
  185.             *p1 = '\0';
  186.  
  187.             while ((*p) && (isspace (*p)))
  188.                {
  189.                ++p;
  190.                }
  191.  
  192.             p1 = tpn->pre;
  193.             while ((*p) && (*p != '/') && (!isspace (*p)))
  194.                {
  195.                *p1++ = *p++;
  196.                }
  197.             *p1 = '\0';
  198.  
  199.             p1 = tpn->suf;
  200.             if ((*p == '\0') || (isspace (*p)))
  201.                {
  202.                *p1 = '\0';
  203.                }
  204.             else
  205.                {
  206.                ++p;
  207.  
  208.                while ((*p) && (!isspace (*p)))
  209.                   {
  210.                   *p1++ = *p++;
  211.                   }
  212.                *p1 = '\0';
  213.                }
  214.  
  215.             tpn->len = strlen (tpn->num);
  216.             tpn->next = NULL;
  217.             if (pn_head == NULL)
  218.                {
  219.                pn_head = tpn;
  220.                }
  221.             else
  222.                {
  223.                pn->next = tpn;
  224.                }
  225.             pn = tpn;
  226.             break;
  227.  
  228.          case 8:                                /* "Event"        */
  229.             c = skip_blanks (&temp[5]);
  230.             parse_event (c);
  231.             break;
  232.  
  233.          case 9:                                /* "Zone"         */
  234.             c = skip_blanks (&temp[4]);
  235.             Zone = atoi (c);
  236.             if (!Zone)                          /* if we didn't find a zone  */
  237.                printf ("Illegal zone: %s\n", &temp[4]);
  238.             break;
  239.  
  240.          case 10:                               /* "MaxReq"       */
  241.             c = skip_blanks (&temp[6]);
  242.             DEFAULT.rq_Limit = atoi (c);
  243.             if (!DEFAULT.rq_Limit)              /* No requests??? */
  244.                printf ("0 requests allowed\n");
  245.             break;
  246.  
  247.          case 11:                               /* "LogLevel"     */
  248.             c = skip_blanks (&temp[8]);
  249.             i = atoi (c);
  250.             if ((i <= 5) && (i > 0))
  251.                {
  252.                loglevel = i;
  253.                }
  254.             else
  255.                {
  256.                printf ("LogLevel must be 1-5 - %s is unknown\n", &temp[8]);
  257.                }
  258.             break;
  259.  
  260.          case 12:                               /* "Baud"         */
  261.             max_baud = atoi (&temp[4]);
  262.             break;
  263.  
  264.          case 13:                               /* "MaxPort"      */
  265.             c = skip_blanks (&temp[7]);
  266.             i = atoi (c);                        /* make it binary            */
  267.             if ((i > 0) && (i < 33))             /* if range is reasonable,   */
  268.                MAXport = i;                      /* Make it the max value     */
  269.             else printf ("Ridiculous MAXport value: %s\n", &temp[7]);
  270.             break;
  271.  
  272.          case 14:                               /* "Port"         */
  273.             c = skip_blanks (&temp[4]);
  274.             i = atoi (c);                        /* make it binary            */
  275.             if ((i > 0) || (i < 33))             /* see if it's OK            */
  276.                {
  277.                port_ptr = i - 1;                 /* store it if so            */
  278.                if (MAXport < i)                  /* See if MAXport is less    */
  279.                   MAXport = i;                   /* If so, increase MAXport   */
  280.                }
  281.             else printf ("Illegal port: %s\n", &temp[4]);
  282.             break;
  283.  
  284.          case 15:                               /* "Carrier"      */
  285.             c = skip_blanks (&temp[7]);
  286.             i = 0;
  287.             sscanf (c, "%x", &i);                /* convert it to binary      */
  288.             if (i != 0)                          /* if we got anything        */
  289.                carrier_mask = i;
  290.             else printf ("Invalid CARRIER mask: %s\n", &temp[7]);
  291.             break;
  292.  
  293.          case 16:                               /* "StatusLog"    */
  294.             log_name = ctl_string (&temp[9]);
  295.             if ((status_log = fopen (log_name, "a")) == NULL)
  296.                {
  297.                free (log_name);
  298.                log_name = NULL;
  299.                }
  300.             else
  301.                {
  302.                fprintf (status_log, "\n");
  303.                fflush(status_log);  /*PLF Sat  05-06-1989  05:38:37 */
  304.                real_flush (fileno (status_log));
  305.                }
  306.             break;
  307.  
  308.          case 17:                               /* "Reader"       */
  309.             BBSreader = ctl_string (&temp[6]);
  310.             break;
  311.  
  312.          case 18:                               /* "BossPhone"    */
  313.             BOSSphone = ctl_string (&temp[9]);
  314.             break;
  315.  
  316.          case 19:                               /* "BossPwd"      */
  317.             BOSSpwd = ctl_string (&temp[7]);
  318.             break;
  319.  
  320.          case 20:                               /* "Protocol"     */
  321.             if (extern_index == 5)
  322.                break;
  323.             protocols[extern_index++] = ctl_string (&temp[8]);
  324.             break;
  325.  
  326.          case 21:                               /* "System"       */
  327.             system_name = ctl_string (&temp[6]);
  328.             break;
  329.  
  330.          case 22:                               /* "Sysop"        */
  331.             sysop = ctl_string (&temp[5]);
  332.             break;
  333.  
  334.          case 23:                               /* "Boss"         */
  335.             c = skip_blanks (&temp[4]);
  336.             sscanf (c, "%d/%d", &boss_net, &boss_node);
  337.             break;
  338.  
  339.          case 24:                               /* "Point"        */
  340.             i = 5;
  341.             goto address;
  342.  
  343.          case 25:                               /* "Aka"          */
  344.             i = 3;
  345.             goto address;
  346.  
  347.          case 94:                               /* "Address"      */
  348.             i = 7;
  349. address:
  350.             alias[num_addrs].Point = 0;
  351.             c = skip_blanks (&temp[i]);
  352.             i = sscanf (c, "%d:%d/%d.%d", &alias[num_addrs].Zone,
  353.                        &alias[num_addrs].Net, &alias[num_addrs].Node,
  354.                    &alias[num_addrs].Point);
  355.             if (i < 3)
  356.                {
  357.                i = sscanf (c, "%d/%d.%d", 
  358.                           &alias[num_addrs].Net, &alias[num_addrs].Node,
  359.                           &alias[num_addrs].Point);
  360.                if (i < 2)
  361.                    break;
  362.                alias[num_addrs].Zone = Zone;
  363.                }
  364.             Zone = alias[0].Zone;               /* First is real default */
  365.             ++num_addrs;
  366.             break;
  367.  
  368.          case 26:                               /* "Hold"         */
  369.             hold_area = ctl_slash_string (&temp[4]);
  370.             break;
  371.  
  372.          case 27:                               /* "DownLoads"    */
  373.             download_path = ctl_slash_string (&temp[9]);
  374.             break;
  375.  
  376.          case 28:                               /* "NetFile"      */
  377.             DEFAULT.sc_Inbound = ctl_slash_string (&temp[7]);
  378.             break;
  379.  
  380.          case 29:                               /* "Init"         */
  381.             modem_init = ctl_string (&temp[4]);
  382.             break;
  383.  
  384.          case 30:                               /* "Busy"         */
  385.             modem_busy = ctl_string (&temp[4]);
  386.             break;
  387.  
  388.          case 31:                               /* "Prefix"       */
  389.             predial = ctl_string (&temp[6]);
  390.             break;
  391.  
  392.          case 32:                               /* "NodeList"     */
  393.             net_info = ctl_slash_string (&temp[8]);
  394.             break;
  395.  
  396.          case 33:                               /* "Avail"        */
  397.             DEFAULT.rq_FILES = ctl_string (&temp[5]);
  398.             break;
  399.  
  400.          case 34:                               /* "OKFile"       */
  401.             DEFAULT.rq_OKFile = ctl_string (&temp[6]);
  402.             break;
  403.  
  404.          case 35:                               /* "About"        */
  405.             DEFAULT.rq_About = ctl_string (&temp[5]);
  406.             break;
  407.  
  408.          case 36:                               /* "MAILnote"     */
  409.             MAILnote = ctl_string (&temp[8]);
  410.             break;
  411.  
  412.          case 37:                               /* "Banner"       */
  413.             BBSbanner = ctl_string (&temp[6]);
  414.             break;
  415.  
  416.          case 38:                               /* "UnAttended"   */
  417.             un_attended = 1;
  418.             command_line_un = 1;
  419.             break;
  420.  
  421.          case 39:                               /* "OverWrite"    */
  422.             overwrite = 1;
  423.             break;
  424.  
  425.          case 40:                               /* "Rev3"         */
  426.             rev3 = 1;
  427.             break;
  428.  
  429.          case 41:                               /* "ReqOnUs"      */
  430.             on_our_nickel = 1;
  431.             break;
  432.  
  433.          case 42:                               /* "LockBaud"     */
  434.             lock_baud = 1;
  435.             break;
  436.  
  437.          case 43:                               /* "TimeOut"      */
  438.             c = skip_blanks (&temp[7]);
  439.             BBStimeout = atoi (c) * 100;
  440.             if (BBStimeout < 2000)
  441.                BBStimeout = 2000;
  442.             break;
  443.  
  444.          case 44:                               /* "NoSLO"        */
  445.             no_overdrive = 1;
  446.             break;
  447.  
  448.          case 45:                               /* "SlowModem"    */
  449.             slowmodem = 1;
  450.             break;
  451.  
  452.          case 46:                               /* "SmallWindow"  */
  453.             small_window = 1;
  454.             break;
  455.  
  456.          case 47:                               /* "NoPickup"     */
  457.             no_pickup = 1;
  458.             break;
  459.  
  460.          case 48:                               /* "NoRequests"   */
  461.             no_requests = 1;
  462.             break;
  463.  
  464.          case 49:                               /* "NetMail"      */
  465.             break;                               /* for BTCTL & MAIL.SYS      */
  466.  
  467.          case 50:                               /* "Suffix"       */
  468.             postdial = ctl_string (&temp[6]);
  469.             break;
  470.  
  471.          case 51:                               /* "NoFullScreen" */
  472.             fullscreen = 0;
  473.             break;
  474.  
  475.          case 52:                               /* "AutoBaud"     */
  476.             autobaud = 1;
  477.             break;
  478.  
  479.          case 53:                               /* "Gong"         */
  480.             gong_allowed = 1;
  481.             break;
  482.  
  483.          case 54:                               /* "NoCollide"    */
  484.             no_collide = 1;
  485.             break;
  486.  
  487.          case 55:                               /* "TBBSlist"     */
  488.             nodefunc = TBBSLookup;
  489.             break;
  490.  
  491.          case 56:                               /* "TaskView"     */
  492.          case 57:                               /* "TopView"      */
  493.             have_tv = 1;
  494.             break;
  495.  
  496.          case 58:                               /* "ExtrnMail"    */
  497.             c = skip_blanks (&temp[9]);
  498.             if (isdigit (*c))
  499.                {
  500.                lev_ext_mail[num_ext_mail] = atoi (c);
  501.                while ((*c) && (!isspace (*c)))
  502.                   ++c;
  503.                }
  504.             else
  505.                {
  506.                lev_ext_mail[num_ext_mail] = 99;
  507.                }
  508.             ext_mail_string[num_ext_mail++] = ctl_string (c);
  509.             break;
  510.  
  511.          case 59:                               /* "BBSnote"      */
  512.             BBSnote = ctl_string (&temp[7]);
  513.             break;
  514.  
  515.          case 60:                               /* "BBS"          */
  516.             BBSopt = ctl_string (&temp[3]);
  517.             break;
  518.  
  519.          case 61:                               /* "ScriptPath"   */
  520.             script_path = ctl_slash_string (&temp[10]);
  521.             break;
  522.  
  523.          case 62:                               /* "BoxType"      */
  524.             c = skip_blanks (&temp[7]);
  525.             boxtype = atoi (c);
  526.             if ((boxtype > 4) || (boxtype < 0))
  527.                boxtype = 1;
  528.             break;
  529.  
  530.          case 63:                               /* "MultiLink"    */
  531.             have_ml = 1;
  532.             break;
  533.  
  534.          case 64:                               /* "Include"      */
  535.             c = skip_blanks (&temp[7]);
  536.             parse_config (c);
  537.             break;
  538.  
  539.          case 65:                               /* "CaptureFile"  */
  540.             logptr = ctl_string (&temp[11]);
  541.             break;
  542.  
  543.          case 66:                               /* "CursorCol"    */
  544.             c = skip_blanks (&temp[9]);
  545.             cursor_col = atoi (c) - 1;
  546.             if ((cursor_col < 0) || (cursor_col > 79))
  547.                cursor_col = 79;
  548.             break;
  549.  
  550.          case 67:                               /* "CursorRow"    */
  551.             c = skip_blanks (&temp[9]);
  552.             cursor_row = atoi (c) - 1;
  553.             if ((cursor_row < 0) || (cursor_row > 23))
  554.                cursor_row = 22;
  555.             break;
  556.  
  557.          case 68:                               /* "DoingMail"    */
  558.             c = skip_blanks (&temp[9]);
  559.             sprintf (junk, "\r\r%s\r\r", c);
  560.             noBBS = malloc (strlen (junk) + 1);
  561.             strcpy (noBBS, junk);
  562.             break;
  563.  
  564.          case 69:                               /* "EnterBBS"     */
  565.             c = skip_blanks (&temp[8]);
  566.             sprintf (junk, "\r%s\r", c);
  567.             BBSesc = malloc (strlen (junk) + 1);
  568.             strcpy (BBSesc, junk);
  569.             break;
  570.  
  571.          case 70:                               /* "PrivateNet"   */
  572.             c = skip_blanks (&temp[10]);
  573.             pvtnet = atoi (c);
  574.             break;
  575.  
  576.          case 71:                               /* "Packer"       */
  577.             packer = ctl_string (&temp[6]);
  578.             break;
  579.  
  580.          case 72:                               /* "Cleanup"      */
  581.             cleanup = ctl_string (&temp[7]);
  582.             break;
  583.  
  584.          case 73:                               /* "AfterMail"    */
  585.             aftermail = ctl_string (&temp[9]);
  586.             break;
  587.  
  588.          case 74:                               /* "Colors"       */
  589.             c = skip_blanks (&temp[6]);
  590.             colors.background = (unsigned char) (atoi (c) & 0xff);
  591.             c = skip_to_blank (c);
  592.             colors.settings = (unsigned char) (atoi (c) & 0xff);
  593.             c = skip_blanks (c);
  594.             c = skip_to_blank (c);
  595.             colors.history  = (unsigned char) (atoi (c) & 0xff);
  596.             c = skip_blanks (c);
  597.             c = skip_to_blank (c);
  598.             colors.hold     = (unsigned char) (atoi (c) & 0xff);
  599.             c = skip_blanks (c);
  600.             c = skip_to_blank (c);
  601.             colors.call     = (unsigned char) (atoi (c) & 0xff);
  602.             c = skip_blanks (c);
  603.             c = skip_to_blank (c);
  604.             colors.file     = (unsigned char) (atoi (c) & 0xff);
  605.             break;
  606.  
  607.          case 75:                               /* "JanusBaud"    */
  608. #ifdef JANUS
  609.             c = skip_blanks (&temp[9]);
  610.             janus_baud = atoi(c);
  611. #endif
  612.             break;
  613.  
  614.          case 76:                               /* "ReqTemplate"  */
  615.             DEFAULT.rq_Template = ctl_string (&temp[11]);
  616.             break;
  617.  
  618.          case 77:                               /* "KnownAvail"   */
  619.             KNOWN.rq_FILES = ctl_string(&temp[10]);
  620.             break;
  621.  
  622.          case 78:                               /* "KnownReqList" */
  623.             KNOWN.rq_OKFile = ctl_string(&temp[12]);
  624.             break;
  625.  
  626.          case 79:                               /* "KnownAbout"   */
  627.             KNOWN.rq_About = ctl_string (&temp[10]);
  628.             break;
  629.  
  630.          case 80:                               /* "KnownInbound" */
  631.             KNOWN.sc_Inbound = ctl_slash_string (&temp[12]);
  632.             break;
  633.  
  634.          case 81:                               /* "KnownReqLim"  */
  635.             c = skip_blanks (&temp[11]);
  636.             KNOWN.rq_Limit = atoi (c);
  637.             break;         
  638.  
  639.          case 82:                               /* "KnownReqTpl"  */
  640.             KNOWN.rq_Template = ctl_string (&temp[11]);
  641.             break;
  642.  
  643.          case 83:                               /* "ProtAvail"   */
  644.             PROT.rq_FILES = ctl_string(&temp[9]);
  645.             break;
  646.  
  647.          case 84:                               /* "ProtReqList" */
  648.             PROT.rq_OKFile = ctl_string(&temp[11]);
  649.             break;
  650.  
  651.          case 85:                               /* "ProtAbout"   */
  652.             PROT.rq_About = ctl_string (&temp[9]);
  653.             break;
  654.  
  655.          case 86:                               /* "ProtInbound" */
  656.             PROT.sc_Inbound = ctl_slash_string (&temp[11]);
  657.             break;
  658.  
  659.          case 87:                               /* "ProtReqLim"  */
  660.             c = skip_blanks (&temp[10]);
  661.             PROT.rq_Limit = atoi (c);
  662.             break;         
  663.  
  664.          case 88:                               /* "ProtReqTpl"  */
  665.             PROT.rq_Template = ctl_string (&temp[10]);
  666.             break;
  667.  
  668.          case 89:                               /* "Application" */
  669.             break;
  670.  
  671.          case 90:                               /* "NoZones"     */
  672.             no_zones = 1;
  673.             break;
  674.  
  675.          case 91:                               /* "Answer"        */
  676.             ans_str = ctl_string (&temp[6]);
  677.             break;
  678.  
  679.          case 92:                               /* "PollTries"   */
  680.             c = skip_blanks (&temp[9]);
  681.             poll_tries = atoi (c);
  682.             break;
  683.  
  684.          case 93:                               /* "SwapDir"     */
  685.             c = skip_blanks (&temp[7]);
  686.             i = strlen (c);
  687.             swapdir = malloc (i + 15);
  688.             strcpy (swapdir, c);
  689.             add_backslash (swapdir);
  690.             strcat (swapdir, "BTXXXXXX");
  691.             mktemp (swapdir);
  692.             break;
  693.  
  694.          case 95:                               /* "Curmudgeon"  */
  695.             ++curmudgeon;                       /* Do it like Randy */
  696.             break;
  697.  
  698.          case 96:                               /* "NoWaZOO"     */
  699.             ++no_WaZOO;                         /* FTSC sessions */
  700.             break;
  701.  
  702.          case 97:                               /* "ScreenBlank" */
  703.             do_screen_blank = 1;
  704.             break;
  705.  
  706.          case 98:                               /* "Mark_Kromm"  */
  707.  
  708.             /* These colors from Mark Kromm, Fidonet 1:261/1034  */
  709.  
  710.             colors.background = 112;            /* The           */
  711.             colors.settings   =   9;            /* Great         */
  712.             colors.history    =  10;            /* BinkleyTerm   */
  713.             colors.hold       =  11;            /* Colors        */
  714.             colors.call       =  14;            /* Contest       */
  715.             colors.file       =  12;            /* Winner!!!!    */
  716.             break;
  717.  
  718.          case 99:                               /* "Server"      */
  719.             server_mode = 1;
  720.             break;
  721.  
  722.          default:
  723.             printf ("Unknown config line: %s\n", temp);
  724.          }
  725.       }
  726.    fclose (stream);                              /* close input file          */
  727.     /*PLF Mon  05-08-1989  06:29:17 */
  728.     /*plf - a number of places reference e_ptrs[] when there aren't any. Rathter
  729.      * than track down all those bugs I am just allocating one of 'em
  730.      */
  731.    if( !num_events )
  732.       e_ptrs[0] = calloc (sizeof (EVENT), 1);
  733. }
  734.  
  735. char *ctl_string (source)                        /* malloc & copy to ctl      */
  736. char *source;
  737. {
  738.    char *dest, *c;
  739.    int i;
  740.  
  741.    c = skip_blanks (source);                     /* get over the blanks       */
  742.    i = strlen (c);                               /* get length of remainder   */
  743.    if (i < 1)                                    /* must have at least 1      */
  744.       return (NULL);                             /* if not, return NULL       */
  745.    dest = malloc (++i);                          /* allocate space for string */
  746.    strcpy (dest, c);                             /* copy the stuff over       */
  747.    return (dest);                                /* and return the address    */
  748. }
  749.  
  750. static char *ctl_slash_string (source)           /* malloc & copy to ctl      */
  751. char *source;
  752. {
  753.    char *dest, *c, *t;
  754.    int i;
  755.    struct stat buffer;
  756.  
  757.    c = skip_blanks (source);                     /* get over the blanks       */
  758.    i = strlen (c);                               /* get length of remainder   */
  759.    if (i < 1)                                    /* must have at least 1      */
  760.       return (NULL);                             /* if not, return NULL       */
  761.    t = dest = malloc (i+2);                      /* allocate space for string */
  762.    strcpy (dest, c);                             /* copy the stuff over       */
  763.    delete_backslash (dest);                      /* get rid of trailing stuff */
  764.    /* Check to see if the directory exists */
  765.    i = stat (dest, &buffer);
  766.    if (i || (!(buffer.st_mode & S_IFDIR)))
  767.       {
  768.       printf ("Directory '%s' does not exist!\n", dest);
  769.       printf ("  BinkleyTerm may fail to execute properly because of this!\n");
  770.       return(NULL);
  771.       }
  772.    add_backslash (dest);                         /* add the backslash         */
  773.    return (dest);                                /* return the directory name */
  774. }
  775.  
  776.  
  777. char *add_backslash (str)
  778. char           *str;
  779. {
  780.    char           *p;
  781.  
  782.    p = str + strlen (str) - 1;
  783.  
  784.    if (p >= str)
  785.       {
  786.       /* Strip off the trailing blanks */
  787.       while ((p >= str) && (isspace (*p)))
  788.          {
  789.          *p = '\0';
  790.          --p;
  791.          }
  792.  
  793.       /* Put a backslash if there isn't one */
  794.       if ((p >=str) && (*p != '\\') && (*p != '/'))
  795.          {
  796.          *(++p) = '\\';
  797.          *(++p) = '\0';
  798.          }
  799.       }
  800.  
  801.    return (fancy_str (str));
  802. }
  803.  
  804. char *delete_backslash (str)
  805. char           *str;
  806. {
  807.    char           *p;
  808.  
  809.    p = str + strlen (str) - 1;
  810.  
  811.    if (p >= str)
  812.       {
  813.       /* Strip off the trailing blanks */
  814.       while ((p >= str) && (isspace (*p)))
  815.          {
  816.          *p = '\0';
  817.          --p;
  818.          }
  819.  
  820.       /* Get rid of backslash if there is one */
  821.       if ((p >=str) && ((*p == '\\') || (*p == '/')))
  822.          {
  823.          if ((p > str) && (*(p-1) != ':'))      /* Don't delete on root */
  824.             *p = '\0';
  825.          }
  826.       }
  827.  
  828.    return (fancy_str (str));
  829. }
  830.  
  831.